package old.items;

import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;


public class PoleTekstowe extends ElementPanelu implements Runnable
{
    public static final int TRYB_NUMERYCZNY = 0;
    public static final int TRYB_ALFA_MALE = 1;
    public static final int TRYB_ALFA_DUZE = 2;
    
    private static Image[] tryby = new Image[3];
    
    private static char[][] KLAWISZ_1 = { { '1' }, { '.', ',', '?', '!', '1', '-' }, { '.', ',', '?', '!', '1', '-' } };
    private static char[][] KLAWISZ_2 = { { '2' }, { 'a', 'b', 'c', '2' }, { 'A', 'B', 'C', '2' } };
    private static char[][] KLAWISZ_3 = { { '3' }, { 'd', 'e', 'f', '3' }, { 'D', 'E', 'F', '3' } };
    private static char[][] KLAWISZ_4 = { { '4' }, { 'g', 'h', 'i', '4' }, { 'G', 'H', 'I', '4' } };
    private static char[][] KLAWISZ_5 = { { '5' }, { 'j', 'k', 'l', '5' }, { 'J', 'K', 'L', '5' } };
    private static char[][] KLAWISZ_6 = { { '6' }, { 'm', 'n', 'o', '6' }, { 'M', 'N', 'O', '6' } };
    private static char[][] KLAWISZ_7 = { { '7' }, { 'p', 'q', 'r', 's', '7' }, { 'P', 'Q', 'R', 'S', '7' } };
    private static char[][] KLAWISZ_8 = { { '8' }, { 't', 'u', 'v', '8' }, { 'T', 'U', 'V', '8' } };
    private static char[][] KLAWISZ_9 = { { '9' }, { 'w', 'x', 'y', 'z', '9' }, { 'W', 'X', 'Y', 'Z', '9' } };
    private static char[][] KLAWISZ_0 = { { '0' }, { ' ', '0' }, { ' ', '0' } };
    
    private int trybWstawiania = TRYB_ALFA_MALE;
    private int indeksWstawiania = 0;
    private int pozycjaWstawiania = 0;
    private int przesuniecieX = 0;

    private int ostatniZnak = Integer.MIN_VALUE;
    private int ostatniKod = Integer.MIN_VALUE;
    private boolean trwaWprowadzanie = false;
    private boolean widacKaretke = true;
    private long czasKaretki = 250;
    private long ostatniCzasKaretki = 0;
    private long czas = 0;
    private long maxCzas = 500;
    
    private StringBuffer bufor = new StringBuffer();
    
    private Thread watek = null;
    private boolean zatrzymajWatek = true;
    
    public PoleTekstowe(String e)
    {
        etykieta = e;
        init();
    }
    
    private static void init()
    {
        if(tryby[0] != null)
            return;
        try
        {
            tryby[TRYB_NUMERYCZNY] = Image.createImage("/gui/images/tryb0.png");
            tryby[TRYB_ALFA_MALE] = Image.createImage("/gui/images/tryb1.png");
            tryby[TRYB_ALFA_DUZE] = Image.createImage("/gui/images/tryb2.png");
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    
    protected void obliczPozycjeWstawiania(String tekst, int szerokosc)
    {
        pozycjaWstawiania = panel.duzaCzcionka.substringWidth(tekst, 0, indeksWstawiania);
        if(pozycjaWstawiania + przesuniecieX < 0)
            przesuniecieX = -pozycjaWstawiania;
        else if(pozycjaWstawiania + przesuniecieX > szerokosc)
            przesuniecieX = szerokosc - pozycjaWstawiania;
    }

    public boolean akcja(int kod)
    {
        switch(kod)
        {
            case -3:    // LEFT:
                if(indeksWstawiania > 0)
                    indeksWstawiania--;
                return true;
            case -4:    // RIGHT:
                if(indeksWstawiania < bufor.length())
                {
                    if(trwaWprowadzanie)
                        trwaWprowadzanie = false;
                    else
                        indeksWstawiania++;
                }
                else if(trwaWprowadzanie)
                    trwaWprowadzanie = false;
                return true;
        }
        return false;
    }

    protected char[] tabliceZnakow(int kod)
    {
        switch(kod)
        {
            case Canvas.KEY_NUM0: return KLAWISZ_0[trybWstawiania];
            case Canvas.KEY_NUM1: return KLAWISZ_1[trybWstawiania];
            case Canvas.KEY_NUM2: return KLAWISZ_2[trybWstawiania];
            case Canvas.KEY_NUM3: return KLAWISZ_3[trybWstawiania];
            case Canvas.KEY_NUM4: return KLAWISZ_4[trybWstawiania];
            case Canvas.KEY_NUM5: return KLAWISZ_5[trybWstawiania];
            case Canvas.KEY_NUM6: return KLAWISZ_6[trybWstawiania];
            case Canvas.KEY_NUM7: return KLAWISZ_7[trybWstawiania];
            case Canvas.KEY_NUM8: return KLAWISZ_8[trybWstawiania];
            case Canvas.KEY_NUM9: return KLAWISZ_9[trybWstawiania];
        }
        return null;
    }
    
    public void klawisz(int kod)
    {
        switch(kod)
        {
            case -8: //clear
                if(indeksWstawiania > 0)
                {
                    indeksWstawiania--;
                    bufor.deleteCharAt(indeksWstawiania);
                    trwaWprowadzanie = false;
                }
                break;
            case Canvas.KEY_POUND:
                trybWstawiania = (trybWstawiania + 1) % 3;
                if(trybWstawiania == 0)
                    maxCzas = 0;
                else
                    maxCzas = 500;
                trwaWprowadzanie = false;
                break;
        }
        char[] znaki = tabliceZnakow(kod);
        if(znaki != null)
        {
            if(ostatniKod == kod && trwaWprowadzanie)
                bufor.setCharAt(indeksWstawiania - 1, znaki[++ostatniZnak % znaki.length]);
            else
            {
                ostatniKod = kod;
                trwaWprowadzanie = true;
                ostatniZnak = 0;
                bufor.insert(indeksWstawiania, znaki[ostatniZnak]);
                indeksWstawiania++;
            }
            czas = System.currentTimeMillis();
            odrysuj();
        }
    }
    
    private void sprawdzCzasy()
    {
        long aktualnyCzas = System.currentTimeMillis();
        if(aktualnyCzas - czas > maxCzas)
            trwaWprowadzanie = false;
        if(aktualnyCzas - ostatniCzasKaretki > czasKaretki)
        {
            ostatniCzasKaretki = aktualnyCzas;
            widacKaretke = !widacKaretke;
            odrysuj();
        }
    }
    
    public int minimalnaWysokosc()
    {
        return panel.duzaCzcionka.getHeight() + 3 + (etykieta == null ? 0 : panel.malaCzcionka.getHeight());
    }

    public void rysuj(Graphics g, int szerokosc, int wysokosc, boolean wybrany)
    {
        int prz = 0;
        g.setColor(wybrany ? panel.kolorWybranegoTekstu : panel.kolorTekstu);
        
        if(etykieta != null)
        {
            g.setFont(panel.malaCzcionka);
            g.drawString(etykieta + ":", 0, 0, 0);
            prz += panel.malaCzcionka.getHeight();
        }
        
        if(wybrany)
            g.drawImage(tryby[trybWstawiania], szerokosc, (prz + wysokosc) / 2, Graphics.RIGHT | Graphics.VCENTER);
        szerokosc -= tryby[trybWstawiania].getWidth() + 4;
        g.setFont(panel.duzaCzcionka);
        String tekst = bufor.toString();
        obliczPozycjeWstawiania(tekst.substring(0, indeksWstawiania), szerokosc);
        g.setClip(0, prz, szerokosc + 2, wysokosc);
        g.translate(przesuniecieX, 0);
        g.drawString(tekst, 0, prz + 2 /* interlinia */, 0);
        if(widacKaretke && wybrany)
            g.drawLine(pozycjaWstawiania, 3, pozycjaWstawiania, wysokosc - 4);
        g.translate(-przesuniecieX, 0);
    }

    public void wejscie()
    {
        trwaWprowadzanie = false;
        widacKaretke = true;
        ostatniCzasKaretki = System.currentTimeMillis();
        zatrzymajWatek = false;
        watek = new Thread(this);
        watek.start();
    }

    public void wyjscie()
    {
        zatrzymajWatek = true;
        indeksWstawiania = bufor.length();
    }

    public void run()
    {
        while(zatrzymajWatek == false)
        {
            sprawdzCzasy();
            odrysuj();
            try
            {
                synchronized(this)
                {
                    wait(50);
                }
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

}
